

package com.beans;


import com.entidades.Negocios;
import com.entidades.Usuarios;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.el.ELException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.http.HttpSession;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.Transactional;
import javax.transaction.UserTransaction;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.primefaces.event.FileUploadEvent;  
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;  
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

    
/**
 * <p>A simple managed bean to mediate between the user
 * and the persistence layer.</p>
 * @author rlubke
 */
@Named("cNeg")
public class controlNegocios {
    /**
     * <p>The <code>PersistenceContext</code>.</p>
     */
    @PersistenceContext 
    private EntityManager em;
    
    /**
     * <p>The transaction resource.</p>
     */
    @Resource 
    private UserTransaction utx2;

    
    private MapModel emptyModel;  
      
    private String title;  
    private double lat;  
    private double lng;  
    
    public controlNegocios() {  
        emptyModel = new DefaultMapModel();  
    }  
      
    public MapModel getEmptyModel() {  
        return emptyModel;  
    }
    
    
    
    //variables de negocios
    private String cnegNombre;
    private String cnegDescripcion;
    private byte[] cnegLogotipo;
    private String cnegDireccion;
    private String cnegTelefono;
    private String cnegEmail;
    private String cnegPaginaweb;
    private String cnegHorario;
    private String cnegCoordenadas;
    
    //fichero logotipo subido
    public UploadedFile file;  
    public String nombreTemporal;
    public File destFileTemporal;
    public StreamedContent chart;  

    public List<Negocios> vListaNegocios;
    public Negocios SelectedNeg;
    public Negocios negUser;

    public Negocios negocioOferta;
        
    public Negocios getNegocioOferta() {
        return negocioOferta;
    }

    public void setNegocioOferta(Negocios negocioOferta) {
        this.negocioOferta = negocioOferta;
    }
    
    
    
    public Negocios getNegUser() {
        negUser = findNegocioPorUsuario();
        return negUser;
    }

    public void setNegUser(Negocios negUser) {
        this.negUser = negUser;
    }
    
    
    public Negocios getSelectedNeg() {
        return SelectedNeg;
    }

    public void setSelectedNeg(Negocios SelectedNeg) {
        this.SelectedNeg = SelectedNeg;
    }
    
    public StreamedContent getChart() {
        return chart;
    }

    public void setChart(StreamedContent chart) {
        this.chart = chart;
    }
    
    public File getDestFileTemporal() {
        return destFileTemporal;
    }

    public void setDestFileTemporal(File destFileTemporal) {
        this.destFileTemporal = destFileTemporal;
    }
    
    public String getNombreTemporal() {
        return nombreTemporal;
    }

    public void setNombreTemporal(String nombreTemporal) {
        this.nombreTemporal = nombreTemporal;
    }
    
    public UploadedFile getFile() {  
        return file;  
    }  

    public void setFile(UploadedFile file) {  
        this.file = file;  
    }  
    
    public String getCnegNombre() {
        return cnegNombre;
    }

    public void setCnegNombre(String cnegNombre) {
        this.cnegNombre = cnegNombre;
    }

    public String getCnegDescripcion() {
        return cnegDescripcion;
    }

    public void setCnegDescripcion(String cnegDescripcion) {
        this.cnegDescripcion = cnegDescripcion;
    }

    public byte[] getCnegLogotipo() {
        return cnegLogotipo;
    }

    public void setCnegLogotipo(byte[] cnegLogotipo) {
        this.cnegLogotipo = cnegLogotipo;
    }

    public String getCnegDireccion() {
        return cnegDireccion;
    }

    public void setCnegDireccion(String cnegDireccion) {
        this.cnegDireccion = cnegDireccion;
    }

    public String getCnegTelefono() {
        return cnegTelefono;
    }

    public void setCnegTelefono(String cnegTelefono) {
        this.cnegTelefono = cnegTelefono;
    }

    public String getCnegEmail() {
        return cnegEmail;
    }

    public void setCnegEmail(String cnegEmail) {
        this.cnegEmail = cnegEmail;
    }

    public String getCnegPaginaweb() {
        return cnegPaginaweb;
    }

    public void setCnegPaginaweb(String cnegPaginaweb) {
        this.cnegPaginaweb = cnegPaginaweb;
    }

    public String getCnegHorario() {
        return cnegHorario;
    }

    public void setCnegHorario(String cnegHorario) {
        this.cnegHorario = cnegHorario;
    }

    public String getCnegCoordenadas() {
        return cnegCoordenadas;
    }

    public void setCnegCoordenadas(String cnegCoordenadas) {
        this.cnegCoordenadas = cnegCoordenadas;
    }

    

    public List<Negocios> getvListaNegocios() {
        vListaNegocios = findAllNegocios();
        return vListaNegocios;
    }

    public void setvListaNegocios(List<Negocios> vListaNegocios) {
        this.vListaNegocios = vListaNegocios;
    }
    
    
    public void createNegocio() {
        FacesContext context = FacesContext.getCurrentInstance();
        Negocios wneg = new Negocios();

        wneg.setNegNombre(cnegNombre);
        wneg.setNegDescripcion(cnegDescripcion);
        wneg.setNegLogotipo(cnegLogotipo);
        wneg.setNegDireccion(cnegDireccion);
        wneg.setNegTelefono(cnegTelefono);
        wneg.setNegEmail(cnegEmail);
        wneg.setNegPaginaweb(cnegPaginaweb);
        wneg.setNegHorario(cnegHorario);
        wneg.setNegCoordenadas(cnegCoordenadas);

        
        
            try {
                utx2.begin();
                em.persist(wneg);
                utx2.commit();
                
                Map sMap;
                sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
                Usuarios usr = (Usuarios) sMap.get("user");
                Integer IdCurrentUser = usr.getIdUsuario();
                System.out.println("usuario obtenido: " + IdCurrentUser);
                usr.setUsuNegocio(findNegocioPorNombre(cnegNombre).getIdNegocio());    
                usr.setUsuTipo(1); //tipo 1-> usuario tipo negocio

                utx2.begin();
                em.merge(usr);
                utx2.commit();
                
                GuardarLogotipoNegocio(findNegocioPorNombre(cnegNombre).getIdNegocio());
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    context.getApplication().evaluateExpressionGet(context, "Negocio dado de alta!", String.class)
                        ,context.getApplication().evaluateExpressionGet(context, "Puedes empezar a publicar ofertas.", String.class));
                context.addMessage("creategrowl", message);
                
                
                //Carga la lista de solicitudes
                vListaNegocios = findAllNegocios();
               
                //pone la variable de sesion "SPAGINA" para que sea index
                //y actualiza esAdmin y lo activa a true
                controlPrincipal bm = (controlPrincipal) sMap.get("cPri");
                bm.esNegocio = true;
                bm.pagCentro = "negocios/listanegocios";
                
                //return "app-main";
                //return null;
            } catch (NotSupportedException | SystemException | RollbackException | HeuristicMixedException | HeuristicRollbackException | SecurityException | IllegalStateException | ELException e) {               
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                        "Error creating request!",
                                                        "Unexpected error when creating your request.  Please contact the system Administrator");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Unable to create new request",
                                                e);
                //return null;
            }     
        }
    
        public List<Negocios> findAllNegocios() {
            Query query = em.createNamedQuery("Negocios.findAll");
//            Map sMap;
//            sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
//            Usuarios usr = (Usuarios) sMap.get("user");
//            Integer IdCurrentUser = usr.getIdUsuario();
//            Integer paramLike = IdCurrentUser;
//            query.setParameter("solUser", paramLike);
            List<Negocios> tmpNegocios = query.getResultList();
            return tmpNegocios;
        }
        
        public Negocios findNegocioPorUsuario() {
            Map sMap;
            sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
            Usuarios usr = (Usuarios) sMap.get("user");
            
            Query query = em.createNamedQuery("Negocios.findByIdNegocio");
            query.setParameter("idNegocio", usr.getUsuNegocio());
            return (Negocios)query.getSingleResult();
        }
        
        public Negocios findNegocioPorNombre(String nomNeg) {
            Query query = em.createNamedQuery("Negocios.findByNegNombre");
            String paramLike = nomNeg;
            query.setParameter("negNombre", paramLike);
            return (Negocios)query.getSingleResult();
        }        

        public Negocios findNegocioPorId(Integer IdNeg) {
            Query query = em.createNamedQuery("Negocios.findByIdNegocio");
            Integer paramLike = IdNeg;
            query.setParameter("idNegocio", paramLike);
            return (Negocios)query.getSingleResult();
        }
        
        public void upload(UploadedFile file) {  
            if(file != null) {  
                System.out.println("size----------> " + file.getSize());
                System.out.println("file name-----> " + file.getFileName());
                System.out.println("to string-----> " + file.toString());
                System.out.println("content type--> " + file.getContentType());
                
                FacesMessage msg = new FacesMessage("Ok", null);  
                FacesContext.getCurrentInstance().addMessage(null, msg);  
            }  
        }  
        public void handleFileUpload(FileUploadEvent event) throws FileNotFoundException, IOException {  
            
            System.out.println("entrando el MNEJADOR DE ARCHIVOS SUBIDOS!");
            
            upload(event.getFile());
            file = event.getFile();
            GuardarLogotipoNegocioTemporal(file);
            
            System.out.println("destino temporal::::::>> " + destFileTemporal.getPath());
            
        }  
        
        public void GuardarLogotipoNegocioTemporal(UploadedFile file) throws FileNotFoundException, IOException{
            
            //create an InputStream from the uploaded file
            InputStream inputStr = null;
            try {
                inputStr = file.getInputstream();
            } catch (IOException e) {
                System.out.println("Error subiendo archivo: 1");
            }
 
            //create destination File
            
            String destPath;
//            if(tempSw){
                nombreTemporal = (int) (Math.random()* 1999999999+1) + "-" + (int) (Math.random()* 1999999999+1) + "-" + (int) (Math.random()* 1999999999+1);
                //destPath = "C:\\Users\\JAVIER\\Documents\\NetBeansProjects\\AgrupadosSA\\web\\img\\neg\\" + nombreTemporal + ".gif";
                destPath = "\\img\\neg\\" + nombreTemporal + ".gif";
//            }else{
//                destPath = "C:\\Users\\JAVIER\\Documents\\NetBeansProjects\\AgrupadosSA\\web\\img\\neg\\logo" + NegId + ".gif";
//            }
            
            //System.out.println("destino::::::: " + destPath);
            destFileTemporal = new File(destPath);
            
            //System.out.println("fichero destino::::::: " + destFile.getPath() + "<<<<<>>>>>" + destFile.getName());

//            File afile;
//            afile = new File(file.getFileName());
//            if(!afile.renameTo(new File(file.getFileName()))){
//                System.out.println("Error subiendo archivo: 1.5");
//            }
            //use org.apache.commons.io.FileUtils to copy the File
            try {                    
                FileUtils.copyInputStreamToFile(inputStr, destFileTemporal);
            } catch (IOException e) {
                System.out.println("Error subiendo archivo: 2");
            }

            //File chartFile = new File(destPath);
            chart = new DefaultStreamedContent(new FileInputStream(destFileTemporal), "image/gif");

            
            InputStream is;
            is = file.getInputstream();
            cnegLogotipo = IOUtils.toByteArray(is);
            
            destFileTemporal.delete();
            
            //System.out.println("phase id--> " + event.getPhaseId());
            System.out.println("Succesful " + file.getFileName() + " is uploaded.");
            
        }
        
        public void GuardarLogotipoNegocio(Integer NegId){
            
            //create destination File
            String destPath = "\\img\\neg\\" + NegId + ".gif";
            
            //System.out.println("destino::::::: " + destPath);
            File destFile = new File(destPath);
            //System.out.println("fichero destino::::::: " + destFile.getPath() + "<<<<<>>>>>" + destFile.getName());

            if(!destFileTemporal.renameTo(destFile)){
                System.out.println("Error subiendo archivo: 2.5");
            }

            //System.out.println("phase id--> " + event.getPhaseId());
            System.out.println("Succesful " + destFile.getPath() + " is uploaded.");
            
        }
        
        public void onPointSelect(PointSelectEvent event) {  
            LatLng latlng = event.getLatLng();  

            System.out.println("tostring.> " + latlng.toString()); 
            System.out.println("cadena.> " + latlng.getLat() + ", " + latlng.getLng()); 
            
            FacesMessage msg = new FacesMessage("Lat:" + latlng.getLat() + ", Lng:" + latlng.getLng(), null);  
                FacesContext.getCurrentInstance().addMessage(null, msg);  
            
            cnegCoordenadas = latlng.getLat() + ", " + latlng.getLng();
            lat = latlng.getLat();
            lng = latlng.getLng();
            addMarker();
        }  
        
        public DefaultStreamedContent NegChartM(Integer NegId){
            
            //System.out.println("Negocio id enviado a neg chart::>>>" + NegId + "<<");
             
            String idn = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("idn");
            if(NegId == null){ 
                if(idn == null || idn.isEmpty()){
                    //System.out.println("RETORNA NULL 2!");
                    return null;     
                }else{
                    //System.out.println("DICE QUE NegId ES NULO... Y VALE ESTO: " + NegId + " e idn no es nulo y vale esto: " + idn);
                }
                NegId = Integer.valueOf(idn);
            }else{
                //System.out.println("DICE QUE NegId NO ES NULO... Y VALE ESTO: " + NegId + " e idn vale esto: " + idn);
            }
            System.out.println("FINALIZA ENVIANDO ESTE NEGID EN NEGCHARTM------->: " + NegId);
            //System.out.println("ESTE ES EL NEGOCIO QUE ENCUENTRA--->: " + findNegocioPorId(NegId).getNegNombre());
            //System.out.println("Y ESTE ES EL STREAM DEL NEGOCIO---->: " + findNegocioPorId(NegId).getNegLogotipo());
            return new DefaultStreamedContent(new ByteArrayInputStream(findNegocioPorId(NegId).getNegLogotipo()));
            
        }
        
        public void addMarker() {  
            Marker marker = new Marker(new LatLng(lat, lng), "Tu restaurante");  
            emptyModel.getMarkers().clear();
            emptyModel.addOverlay(marker); 
            
        }
        
        public MapModel mapModelSelNeg(String coordenadas){
            
            if(coordenadas.isEmpty()){return null;}
            
                Integer posComa = coordenadas.indexOf(",");
                String stLat = coordenadas.substring(0,posComa);
                String stLng = coordenadas.substring(posComa+1);
            
            System.out.println("cordenadas-> " + coordenadas + "   Lat:" + stLat + " Lng:" + stLng);
            
            Marker marker = new Marker(new LatLng(Double.valueOf(stLat),Double.valueOf(stLng)));
            
            emptyModel.getMarkers().clear();
            emptyModel.addOverlay(marker);
            return emptyModel;
            
        }
    }
